/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package modbus;

/**
 *
 * @author Leandro
 */
public class Paquete {

    private static void incrementarTxNro() {
        Paquete.idTransGral++;
    }

    private int idDispositivo;
    private int codigoFuncion;
    private byte[] data;
    private int[] crc;
    private byte[] paquete;
    
    private int transIdent;
    private int protocolIdent = 0;
    private int length;
    private int unitident;

    public static int getIdTransGral() {
        return idTransGral;
    }

    public static void setIdTransGral(int idTransGral) {
        Paquete.idTransGral = idTransGral;
    }

    private static int idTransGral=0;

    public int getCodigoFuncion() {
        return codigoFuncion;
    }

    public void setCodigoFuncion(int codigoFuncion) {
        this.codigoFuncion = codigoFuncion;
    }

    public int[] getCrc() {
        return crc;
    }

    public void setCrc(int[] crc) {
        this.crc = crc;
    }

    public byte[] getData() {
        return data;
    }

    public void setData(byte[] data) {
        this.data = data;
    }

    public int getIdDispositivo() {
        return idDispositivo;
    }

    public void setIdDispositivo(int idDispositivo) {
        this.idDispositivo = idDispositivo;
    }

    public int getLength() {
        return length;
    }

    public void setLength(int length) {
        this.length = length;
    }

    public int getProtocolIdent() {
        return protocolIdent;
    }

    public void setProtocolIdent(int protocolIdent) {
        this.protocolIdent = protocolIdent;
    }

    public int getTransIdent() {
        return transIdent;
    }

    public void setTransIdent(int transIdent) {
        this.transIdent = transIdent;
    }

    public int getUnitident() {
        return unitident;
    }

    public void setUnitident(int unitident) {
        this.unitident = unitident;
    }

    
    

    public Paquete(int idD, int codF){
        this.idDispositivo=idD;
        codigoFuncion=codF;
        this.unitident=idD;
        
    }

    public void prepareReadRegisters(int startAdress,int cantRegistros){
        //this.codigoFuncion=3;
        if(data==null){
            data=new byte[4];
            //data[0]=startAdress.byteValue();
            data[0]=(byte)( startAdress >>> 8);
            data[1]=(byte)startAdress;
            data[2]=(byte)(cantRegistros >>> 8);
            data[3]=(byte)cantRegistros;
    
        }

    }

    public void prepareWriteSingleRegister(int dir, int valuewrite) {
        if(data==null){
            data=new byte[4];
            //data[0]=startAdress.byteValue();
            data[0]=(byte)( dir >>> 8);
            data[1]=(byte)dir;
            data[2]=(byte)(valuewrite >>> 8);
            data[3]=(byte)valuewrite;

        }
    }

    public  void prepareWriteMultipleRegisters(int dir, int cantReg, int[] valuewrite) {
        if (data==null){
        data=new byte[5+(cantReg*2)];
        data[0]=(byte)( dir >>> 8);
        data[1]=(byte)dir;
        data[2]=(byte)(cantReg >>> 8);
        data[3]=(byte)cantReg;
        data[4]=(byte)(cantReg*2);
        int a;
        int b=4;
        for(a=0;a<cantReg;a++){
            int aux = valuewrite[a];
            data[b+a+1]=(byte)(aux >>> 8);
            data[b+a+2]=(byte)aux;
          /*  System.out.println(b+a+1);  
            System.out.println(b+a+2); 
            System.out.println(data[b+a+1]);   
            System.out.println(data[b+a+2]);
            System.out.println(valuewrite[a]);*/
            b++;
         }
        }
    }


    public byte[] getPaqueteSerial() {
        paquete=new byte[4+data.length];
        paquete[0]=(byte)idDispositivo;
        paquete[1]=(byte)codigoFuncion;
        int i=2;
        for(byte d : this.data){
            paquete[i]=d;
            i++;
            }
       
        byte[] aux=new byte[paquete.length-2];
        for(int j=0;j<aux.length;j++){
            aux[j]=paquete[j];
        }
        crc = CRC.calculateCRC(aux,0 ,paquete.length-2);
        paquete[paquete.length-1]=(byte)crc[1];
        paquete[paquete.length-2]=(byte)crc[0];



        
        return paquete;
    }

    public void setPaquete(byte[] paquete) {
        this.paquete = paquete;
    }

    public byte[] getPaqueteTCP() {
        if (paquete == null) {
            paquete = new byte[8 + data.length];
            this.transIdent = Paquete.getIdTransGral();
            Paquete.incrementarTxNro();
            paquete[0] = (byte) (this.transIdent >>> 8);
            paquete[1] = (byte) this.transIdent;
            paquete[2] = (byte) (protocolIdent >>> 8);
            paquete[3] = (byte) protocolIdent;
            this.length = data.length + 2;
            paquete[4] = (byte) (length >>> 8);
            paquete[5] = (byte) (length);
            paquete[6] = (byte) idDispositivo;
            paquete[7] = (byte) codigoFuncion;
            int i = 8;
            for (byte d : this.data) {
                paquete[i] = d;
                i++;
            }
        }
        return paquete;
    }




     
    


}
